// 数组

// 1. 数组的定义

// 定义数组的两种方式：

// 方式一：new Array(1, 2, 3)
let arr1 = new Array(1, 2, 3);
console.log(arr1);

// 方式二：[1, 2, 3]
let arr2 = [1, 2, 3];
console.log(arr2);

// 2. 数组的读取

// 数组变量[下标]

console.log(arr2[1]);
console.log("arr2数组的长度：", arr2.length);

// 3. 数组的遍历

// ES5 中数组的遍历方式

// for
// forEach
// map
// filter
// every
// some
// reduce

let arr = [1, 2, 4, 5, 6, 8, 2];

// for循环
for(let i = 0; i < arr.length; i++) {
    console.log(arr[i]);
}

// forEach() 方法

// 注意：forEach 的代码块中不能使用 break、continue，它会抛出异常。

arr.forEach(function(value, index, array){
    console.log(index, value, array);
});

// map() 方法：返回新的数组。
arr.map(function(value, index){
    console.log(index, value);
});

let resultArr1 = arr.map(function(value){
    return value * value;
});

console.log(arr, resultArr1);


// filter() 方法：返回新的数组，返回符合回调函数指定条件的元素数组。
let resultArr2 = arr.filter(function(value){
    return value % 2 === 0;
});

console.log(arr, resultArr2);

// some() 方法：返回boolean，判断是否有元素符合回调函数条件

let result1 = arr.some(function(value){
    return value === 2;
});

console.log(result1);

// every() 方法：返回boolean，判断每个元素是否符合回调函数条件
let result2 = arr.every(function(value){
    return value % 2 === 0;
});

console.log(result2);

// reduce(func, [初始值]) 方法

// reduce 方法的第一参数也是一个回调函数，这个回调函数一共有4个参数，分别是：
// 1. prevValue：上一次回调返回的值
// 2. currentValue：数组中当前被处理的元素
// 3. index：当前元素在数组中的索引
// 4. array：调用 reduce 的数组

// 例如，计算数组所有元素的和
let result = arr.reduce(function(prevValue, currentValue){
    return prevValue + currentValue;
}, 0);

console.log(result); 

// 例如，数组去重
let result4 = arr.reduce(function(prevValue, currentValue){
    prevValue.indexOf(currentValue) === -1 && prevValue.push(currentValue);
    return prevValue;
}, []);

console.log(arr, result4);

// ES6 中数组的遍历方式

let arr4 = [1, 2, 3];

// find()

let res1 = arr4.find(function(value){
    return value === 3;
});

console.log(arr4, res1);

let res2 = arr4.findIndex(function(value){
    return value === 3;
});

console.log(arr4, res2);


// for...of 是支持 break、continue、return 的，所以在功能上非常贴近原生的 for。

for (let value of arr4) {
    console.log(value);
}

for (let value of arr4.values()) {
    console.log(value);
}

for (let index of arr4.keys()) {
    console.log(index);
}

for (let [index, value] of arr4.entries()) {
    console.log(index, value);
}

// 数组的扩展

// 1. 类数组/伪数组

// DOM
let divs = document.getElementsByTagName('div');
console.log(divs); // HTMLCollection []

let divs2 = document.querySelectorAll(".xxx");
console.log(divs2); // NodeList []

// divs2.push(1); // Uncaught TypeError: divs.push is not a function

// ES5
let divArr = Array.prototype.slice.call(divs2);
console.log(divArr);

divArr.push(1); // 此时不报错

// 2. Array.from()
let arrayList = {
    0: "es5",
    1: "es6",
    2: "es7",
    length: 3
};

console.log(arrayList);

// arrayList.push("es8"); // Uncaught TypeError: arrayList.push is not a function

let arrayListNew = Array.from(arrayList);
console.log(arrayListNew);
arrayListNew.push("es8");
console.log(arrayListNew);

// 3. Array.of()
// 4. fill()
// 5. includes()